package main

import (
	"context"
	"fmt"
	"time"

	"gitee.com/go-course/grpc-demo/grpc/auth"
	"gitee.com/go-course/grpc-demo/grpc/protocol"
	"google.golang.org/grpc"
)

func main() {
	conn, err := grpc.Dial("127.0.0.1:1234",
		grpc.WithInsecure(),
		grpc.WithPerRPCCredentials(auth.NewAuthentication("admin", "1234567")),
	)
	if err != nil {
		panic(err)
	}

	// // 请求是，携带meta信息
	// md := metadata.New(map[string]string{auth.ClientIdKey: "admin", auth.ClientSecretKey: "123456"})

	// // 客户端 ---> 发送时 需要携带的上下文信息
	// //  -----> 服务端, 对于服务端来说 这个就是IncomingContext
	// ctx := metadata.NewOutgoingContext(context.Background(), md)

	client := protocol.NewHelloServiceClient(conn)
	resp, err := client.Hello(context.Background(), &protocol.Request{Value: "bob"})
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(resp)

	// 返回一个channle io pipe
	stream, err := client.Chat(context.Background())
	if err != nil {
		panic(err)
	}

	// 在客户端我们将发送和接收操作放到两个独立的Goroutine。

	// 首先是向服务端发送数据
	go func() {
		for {
			err := stream.Send(&protocol.Request{
				Value: "alice",
			})
			if err != nil {
				fmt.Println(err)
				return
			}

			time.Sleep(1 * time.Second)
		}
	}()

	// 然后在循环中接收服务端返回的数据
	for {
		resp, err := stream.Recv()
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Println(resp)
	}

}
